SQL Server アーキテクチャ データベース構造
ページとエクステント
エクステントとは...
ファイルの中身をページに区切るのが基本ではある。
ただ、SQL Serverではテーブルに新しい空ページを割り当てる際、エクステントと言う単位で割り当てる。
このエクステントと言うのは、ページの集まりであり、「8ページ x 8個」で1エクステントとなる。
エクステントには「単一エクステント」と「混合エクステント」の2つが存在する。
単一エクステントは、1つのテーブルのみが利用するエクステントのこと。
混合エクステントは、複数のテーブルが共有で利用するエクステントのこと。
メリデメの話
単一エクステントを利用する場合、無駄な空き容量が増えてしまう可能性がある。
混合エクステントでは、無駄なく容量を使えるが、ページ割り当て時のオーバーヘッドがある。
2016年まではストレージを効率的に使うため、混合エクステントがSQL Serverのデフォルトだった。
しかし、2016年からはページ割り当てのオーバーヘッドがだるいことから、単一エクステントがデフォルトになった。
ページの種類
IN_ROW_DATA:一般的なデータ・インデックスを格納するページ
LOB_DATA:大きいオブジェクト(text, ntext, image, ...)を格納するページ
ROW_OVERFLOW_DATA:ページ上限の8KBを超えた可変長カラムのデータを格納するページ
その他の管理用ページ
GAM(Global Allocation Map)
データファイル内にあるエクステントの割り当て状況を示せるページ。
1つのビットで各エクステントの使用されてる状況を示している。
1つのGAMで最大64000エクステント分の状態を管理できる。
そのエクステントが未割り当て状態ならビットが1に、割り当て済みなら0に設定されてる。
SQL Serverがオブジェクトに新しくエクステントを割り当てる際は、このページ(GAM)が参照される。
SGAM(Shared Global Allocation Map)
GAMがあった上で、さらに混合エクステントの使用状況を管理するページ。
混合エクステントであり、かつ、割り当て済みだが、空きページがある場合、ビットが「1」になる。
単一エクステントだったり、空きページが無いならビットは「0」になる。
PFS(Page Free Space)
1ページで8000ページ分の使用状況を管理する。
1バイトで1つのページの情報を担当。
そのページが使用済み or 未使用かと、使用率が把握できる。
IAM(Index Allocation Map)
インデックスやヒープに割り当てられているエクステんとがわかる。
例えばインデックスAがあったとしたら、そのインデックスAが保持してるエクステントがIAMからわかる。
今のところ、onigiri.w2.iconの推測だがIAMは1つのインデックス or ヒープに属するのだと思われる。
インデックス:IAM = 1:N
トランザクションログファイルの実態
トランザクションログファイルは、複数の仮想ログファイルという単位の集まりで領域管理されてる。
それぞれの仮想ログファイルには、使用/未使用というステータスが存在する。
また、トランザクションログファイルの拡張/縮小も、仮想ログを最小単位にして実施される。
仮想ログファイルの数とサイズ
仮想ログファイルの「数」と「サイズ」はSQL Serverが勝手に決める。
基本的には、以下のようなルールで決めてるらしい
作成/拡張される
ポイント
仮想ログファイルの数が多ければ多いほど、SQL Serverとしてはオーバーヘッドになって性能に悪影響が出る可能性あり
仮想ログファイルのサイズは、SQL Serverが勝手に決める
参考